package 两两交换链表中的节点;

/**
 * @author zhengTao
 * @version 1.0
 * @description: 两两交换链表中的节点, 这种题目最好是画图解决
 * @date 2022/10/15 14:51
 */
public class Demo24 {
    /**
     * Definition for singly-linked list.
     *
     * */
      public class ListNode {
          int val;
          ListNode next;
          ListNode() {}
          ListNode(int val) { this.val = val; }
          ListNode(int val, ListNode next) { this.val = val; this.next = next; }
      }

    public ListNode swapPairs(ListNode head) {
          //定义虚拟头节点
         ListNode pre =new ListNode(-1);
         pre.next=head;
         //当前操作的节点
         ListNode cur=pre;
         //只要后面两个节点不是null,则进行交换
         while (cur.next!=null&&cur.next.next!=null){
                ListNode temp=cur.next;
                ListNode temp1=cur.next.next.next;
               //cur需要指向下下个节点,此时下个节点的指向不见了，所以得提前保存好
               cur.next=cur.next.next;
               //cur需要指向下下个节点(此时已经变成下个节点了，需要指向原来保存的下个节点)，
              // 指向后原来下下下个节点指向丢失了，所以要提前保存
               cur.next.next=temp;
               cur.next.next.next=temp1;
               cur=cur.next.next;
         }
         return pre.next;
    }

}
